//
//  LLPCaptureHelper.h
//  LLP
//
//  Created by Porcellio on 10/10/12.
//  Copyright (c) 2012 Porcellio. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreMedia/CoreMedia.h>
#import <ImageIO/ImageIO.h>

typedef enum {

    LLPCaptureCategoryPhoto = 1,
    LLPCaptureCategoryVideo
    
}LLPCaptureCategory;

/*!
 @protocol LLPCaptureHelperDelegate
 @abstract
    LLPCaptureHelper的委托定义
 
 @discussion
    跟上面的上面的一样一样的
 */
@protocol LLPCaptureHelperDelegate <NSObject>
@optional

/*!
 @method didCaptureStillImage:
 @abstract
    已捕捉照片的委托函数
 
 @param imageData
    图片默认为JPEG格式,这里是原尺寸的图片，可供委托对象来处理压缩
 
 @discussion
    该委托函数会在实例调用captureImage的时候触发
 
 */
- (void)didCaptureStillImage:(NSData *)imageData;

- (void)didChangeDevicePosition:(AVCaptureDevice *)device;

@end

/*!
 @class LLPCaptureHelper
 @abstract
    图片及视频捕捉辅助类
 
 @discussion
    该类支持2中捕捉模式：视频以及图片，捕获的数据由对应的delegate进行传递
 */
@interface LLPCaptureHelper : NSObject {
@private
    id<LLPCaptureHelperDelegate>     _delegate;
    
    AVCaptureSession                *_session;
    AVCaptureDevice                 *_camera;
    AVCaptureDeviceInput            *_inputDevice;
    AVCaptureOutput                 *_outputDevice;
    AVCaptureConnection             *_connection;
    
    LLPCaptureCategory               _category;
}

/*!
 @property delegate
 @abstract
    实例委托
 
 @discussion
    委托，你懂的
 */
@property (nonatomic, assign) id<LLPCaptureHelperDelegate> delegate;

/*!
 @property category
 @abstract
    返回当前捕捉类型
 
 @discussion
    根据当前创建的实例，获取其对应的类型
 */
@property (nonatomic, assign, readonly) LLPCaptureCategory  category;

@property (nonatomic, retain) AVCaptureSession  *session;

+ (BOOL)canSupportCapture;

/*!
 @method initWithCategory:
 @abstract
    构造函数
 
 @param captureCategory
    根据制定的类型，创建对应的类型
 @result
    返回LLPCaptureHelper的实例
 
 @discussion
    由于在设计之处就想一个类支持2种类型的拍摄方式，所以设计了LLPCaptureCategory这个枚举，
 也就有了这个构造函数
 */
- (id)initWithCategory:(LLPCaptureCategory)captureCategory;

/*!
 @method captureImage;
 @abstract
    捕捉照片的函数
 
 @discussion
    这个函数是专门用于捕捉照片的，在这个函数里，会使用delegate来通知被委托对象对
 已捕获的照片进行处理
    PS:看来我真心喜欢在每段注释后面加个".",就像这句一样.
 */
- (void)captureImage;

/*!
 @method startCaptureVideo
 @abstract
    开始进行视频捕捉
 
 @result
    YES表示开始捕捉成功，反之失败
 
 @discussion
    捕捉视频与捕捉照片不同，它有个时间的过程，所以此函数还对应一个endCaptureVideo函数.这个函数会
 不停的往被委托对象传输视频数据，直到调用了endCaptureVideo函数
 
 */
- (BOOL)startCaptureVideo;

/*!
 @method endCaptureVideo
 @abstract
    停止视频捕捉
 
 @discussion
    该函数会通知被委托对象，视频已经拍摄结束
 */
- (void)endCaptureVideo;

- (void)changeCameraPosition;

- (BOOL)isDeviceSupportFlash:(AVCaptureDevice *)device;
@end
